"""
@name : 4.16练习
@author : chenlu
@projectname: python代码文件
"""

#输入数字n，输出n天前的日期(time或者datetime模块）
# import datetime
# import time
# def get_day_nday_ago(date, n):
#     t = time.strptime(date, "%Y-%m-%d")
#     y, m, d = t[0:3]
#     Date = str(datetime.datetime(y, m, d) - datetime.timedelta(n)).split()
#     return Date[0]
#
# a = get_day_nday_ago('2022-04-16',1)
# print(a)

#输出指定文件夹下有哪些文件或文件夹
# import os
# print(os.listdir('D:\sc\python\Scripts'))

#列表去重，并且从小到大排序
# lst = [5, 6, 1, 2, 3, 2, 3, 5, 5, 6, 9]
# lst1 = list(set(lst))
# print('lst1=', lst1)
# list.sort(lst1)

#如何在一个函数内部修改全局变量
# a = 100
# def change1():
#     print(a)
# def change2():
#     global a  # 关键字声明a为全局变量，系统就会去找叫a的全局变量
#     a = 200
#     print(a)
#
# print(a)
# print(change1())
# print(change2())
# print(change1())

#如何跨模块共享全局变量
# import config
# config.x = 1
#
# import config
# import mod
# print(config.x)

#python的基本数据类型有哪些
# 元组 字典 列表 字符串 数字

#python中哪些是可变数据类型，哪些是不可变数据类型
# 可变数据类型：list（列表）、dict（字典）、set（集合，不常用）
# 不可变数据类型：数值类型（int、float、bool）、string（字符串）、tuple（元组）
# 可变数据类型：当该数据类型对应的变量的值发生了变化时，如果它对应的内存地址不发生改变，那么这个数据类型就是 可变数据类型。
# 不可变数据类型：当该数据类型对应的变量的值发生了变化时，如果它对应的内存地址发生了改变，那么这个数据类型就是 不可变数据类型。
# 总结：可变数据类型更改值后，内存地址不发生改变。不可变数据类型更改值后，内存地址发生改变。

#a+=1与a=a+1有什么区别
# 对于不可变对象 a+=1  a=a+1在栈中创建新的对象
# 对于可变对象 a+=1不创建新的对象 a=a+1在栈中创建新的对象

#什么是pep8?说出五点它的标准
# PEP是 Python Enhancement Proposal 的缩写，就是 Python增强建议书
# 缩进
# 不要使用 tab 缩进
# 使用任何编辑器写 Python，请把一个 tab 展开为 4 个空格
# 绝对不要混用 tab 和空格，否则容易出现 IndentationError
# 空格
# 在 list, dict, tuple, set, 参数列表的 , 后面加一个空格
# 在 dict 的 : 后面加一个空格
# 在注释符号 # 后面加一个空格，但是 #!/usr/bin/python 的 # 后不能有空格
# 操作符两端加一个空格，如 +, -, *, /, |, &, =
# 接上一条，在参数列表里的 = 两端不需要空格
# 括号（(), {}, []）内的两端不需要空格
# 空行
# function 和 class 顶上两个空行
# class 的 method 之间一个空行
# 函数内逻辑无关的段落之间空一行，不要过度使用空行
# 不要把多个语句写在一行，然后用 ; 隔开
# if/for/while 语句中，即使执行语句只有一句，也要另起一行
# 换行
# 每一行代码控制在 80 字符以内
# 使用 \ 或 () 控制换行
# 命名
# 使用有意义的，英文单词或词组，绝对不要使用汉语拼音
# package/module 名中不要出现 -

#给定一个字符串，找出字符串第一个重复的字符
# str = 'abfdxsdsfsa'
# for i in str:
#     if str.count(i) >= 2:
#         print(i)
#         break

#简述深拷贝与浅拷贝
# 对内存地址的复制，让目标对象指针和源对象指向同一片内存空间。注意：当内存销毁的时候，只想对象的指针，必须重新定义，才能够使用
# 深拷贝是指，拷贝对象的具体内容，二内存地址是自主分配的，拷贝结束之后俩个对象虽然存的值是一样的，但是内存地址不一样，俩个对象页互相不影响，互不干涉

#简述python内存机制
# Python的底层第0层是由C语言编写的Python解释器，因此Python程序是用Python封装好、由底层的C实现运行的。另外，由于Python的运行需要挂钩解释器，因此多个线程不能同时运行。即使使用GIL库，高频切换占用解释器的线程，实际上也没有使用CPU的多核实现真正的并行，使用GIL的Python多线程操作是伪装的多线程并行。Python的内存机制呈现金字塔状：
# -1，-2层主要由操作系统进行操作。
# 第0层是C中的malloc，free等内存分配和释放函数进行操作；
# 第1层和第2层是内存池，有Python的接口函数PyMem_Malloc函数实现，当对象小于256K时有该层直接分配内存；
# 第3层是最上层，也就是我们对Python对象的直接操作；底层代码是由C语言完成的。

#使用python实现冒泡排序，快速排序
# 冒泡排序（Bubble Sort）也是一种简单直观的排序算法。
# 它重复地走访过要排序的数列，一次比较两个元素，如果他们的顺序错误就把他们交换过来。
# 走访数列的工作是重复地进行直到没有再需要交换，也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

# def bubble_sort(lst):
#     for i in range(len(lst) - 1):
#         flag = False
#         for j in range(len(lst) - 1 - i):
#             if lst[j] > lst[j + 1]:
#                 lst[j], lst[j + 1] = lst[j + 1], lst[j]
#                 flag = True   #如果元素之间交换了位置，将变量重新赋值给True
#                 print(lst)
#         if not flag:
#             break
#     return lst
#
# lst = [1, 7, 6, 4, 5]
# print(bubble_sort(lst))

# 快速排序使用分治法（Divide and conquer）策略来把一个序列（list）分为较小和较大的2个子序列，然后递归地排序两个子序列。
# def quick_sort(arr):
#     if len(arr) < 2:
#         return arr
#     mid = arr[len(arr)//2]
#     left = []
#     right = []
#     arr.remove(mid)
#     for i in arr:
#         if i >= mid:
#             right.append(i)
#         else:
#             left.append(i)
#     return quick_sort(left) + [mid] + quick_sort(right)
#
# arr = [6, 2, 9, 8, 3, 5]
# print(quick_sort(arr))

#验证一个字符串是否属于回文
# str = input("请输入一个字符串：")
# if str == str[::-1]:
#     print("该字符串属于回文")
# else:
#     print("该字符串不属于回文")

# import datetime
# import requests
# import json
#
# with open('result.txt', 'w', encoding='utf-8') as fp1:
#     array = []
#     with open('C:\\Users\\cl\\Desktop\\笔记\\sc.linux\\python\\weblog.txt', 'r') as fp:
#         lst = fp.readlines()
#         for i in range(len(lst)):
#             temp_list = []
#             for element in lst[i].split():
#                 temp_list.append(element)
#             array.append(temp_list)
#             newtime = datetime.datetime.strptime(array[i][3], '[%d/%b/%Y:%H:%M:%S').strftime('%Y-%m-%d %H:%M:%S')
#             response = requests.get(f'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip={array[i][0]}')
#             ip_information = response.json()
#             isp = ip_information["data"]["isp"]
#             region = ip_information["data"]["region"]
#             fp1.write(newtime + "," + region + "," + isp + "," + array[i][9] + '\n')